1 module hip.hipaudio.backend.opensles.source; 2 version(Android): 3 import hip.error.handler; 4 import hip.hipaudio.audioclip; 5 import hip.hipaudio.backend.sles; 6 import hip.util.time; 7 import hip.hipaudio.audiosource; 8 9 version(Android): 10 11 class HipOpenSLESAudioSource : HipAudioSource 12 { 13 SLIAudioPlayer* audioPlayer; 14 bool isStreamed; 15 this(SLIAudioPlayer* player, bool isStreamed) 16 { 17 audioPlayer = player; 18 this.isStreamed = isStreamed; 19 } 20 21 alias clip = HipAudioSource.clip; 22 override IHipAudioClip clip(IHipAudioClip clip) 23 { 24 super.clip(clip); 25 return clip; 26 } 27 28 override bool play() 29 { 30 SLIBuffer* buf = getBufferFromAPI(clip).sles; 31 SLIAudioPlayer.Enqueue(*audioPlayer, buf.data.ptr, buf.size); 32 buf.isLocked = true; 33 buf.hasBeenProcessed = false; 34 35 import hip.console.log; 36 37 logln("SampleRate: ", clip.getSampleRate); 38 logln("Output: ", clip.getHint().outputSamplerate); 39 float rate = cast(float)clip.getSampleRate() / cast(float)clip.getHint().outputSamplerate; 40 41 SLIAudioPlayer.setRate(*audioPlayer, rate); 42 43 SLIAudioPlayer.play(*audioPlayer); 44 return true; 45 } 46 47 alias loop = HipAudioSource.loop; 48 override bool loop(bool shouldLoop) 49 { 50 super.loop(shouldLoop); 51 SLIAudioPlayer.setLoop(*audioPlayer, shouldLoop); 52 return shouldLoop; 53 } 54 55 override bool stop() 56 { 57 SLIAudioPlayer.stop(*audioPlayer); 58 return false; 59 } 60 61 override bool pause() 62 { 63 SLIAudioPlayer.pause(*audioPlayer); 64 return false; 65 } 66 bool resume() 67 { 68 SLIAudioPlayer.resume(*audioPlayer); 69 return false; 70 } 71 72 73 override void pullStreamData() 74 { 75 import hip.util.memory; 76 77 ErrorHandler.assertExit(clip !is null, "Can't pull stream data without any buffer attached"); 78 ErrorHandler.assertExit(audioPlayer.playerObj != null, "Can't pull stream data without null audioplayer"); 79 uint decoded = clip.updateStream(); 80 import hip.console.log; 81 HipAudioBufferWrapper* freeBuf = getFreeBuffer(); 82 83 if(freeBuf != null) 84 { 85 audioPlayer.removeFreeBuffer(freeBuf.buffer.sles); 86 sendAvailableBuffer(freeBuf.buffer); 87 } 88 HipAudioClip c = cast(HipAudioClip)clip; 89 SLIBuffer* buf = c.getBuffer(c.getClipData(), c.chunkSize).sles; 90 audioPlayer.pushBuffer(buf); 91 92 } 93 94 override HipAudioBufferWrapper* getFreeBuffer() 95 { 96 SLIBuffer* b = audioPlayer.getProcessedBuffer(); 97 if(b == null) 98 return null; 99 HipAudioBuffer buffer; 100 buffer.sles = b; 101 return (cast(HipAudioClip)clip).findBuffer(buffer); 102 } 103 104 }